package com.chixing.fourteen.Utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @author Y2014188432
 *  MD5 加密工具类
 */
public class MessageDigestUtil {
    /**
     * 生成 MD5 加密信息
     * @param str 原内容
     * @return 加密后内容
     */
    public static String getMessageDigest(String str){
        try {
            // 启动一个 MD5 启动器
            MessageDigest md5 = MessageDigest.getInstance("MD5");

            // 输入的字符串转字节数组
            byte[] bytes = str.getBytes();

            //输入字符串转换得到的字节数组
            md5.update(bytes);

            //转换并返回结果
            byte[] resultBytes = md5.digest();

            //字符数组转换字符串
            return byteArrayToHex(resultBytes);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 用于将字节数组换成成16进制的字符串
     * @param byteArray 要转换的字节数组
     * @return 转换后的字符串
     */
    public static String byteArrayToHex(byte[] byteArray) {

        // 首先初始化一个字符数组，用来存放每个16进制字符
        char[] hexDigits = {'0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F' };

        // new一个字符数组，这个就是用来组成结果字符串的（解释一下：一个byte是八位二进制，也就是2位十六进制字符（2的8次方等于16的2次方））
        char[] resultCharArray =new char[byteArray.length * 2];

        // 遍历字节数组，通过位运算（位运算效率高），转换成字符放到字符数组中去
        int index = 0;

        // 八位二进制分段与 1111 进行和运算
        for (byte b : byteArray) {

            // 高位与 1111 进行和运算
            resultCharArray[index++] = hexDigits[b>>> 4 & 0xf];

            // 低位与 1111 进行和运算
            resultCharArray[index++] = hexDigits[b & 0xf];

        }

        // 字符数组组合成字符串返回
         return new String(resultCharArray);
    }
}
